package  
{
	/**
	 * ...
	 * @author Marcelo Guardia
	 */
	//---*Importamos Includs necesarios de FlashPunk!
	import flash.utils.Endian;
	import net.flashpunk.Entity;
	import net.flashpunk.graphics.Tilemap;	
	import net.flashpunk.masks.Masklist;
	import net.flashpunk.World;	
	import net.flashpunk.masks.Grid;
	import flash.utils.ByteArray;
	import net.flashpunk.FP;
	import net.flashpunk.graphics.Text;
	import net.flashpunk.graphics.Graphiclist;
	
	public class Level extends Entity
	{
		private var TileLayer0:Tilemap;				
		private var SolidGrid:Grid;		
		private var level_xml:XML;
		private var project_xml:XML;
		
		public var LevelWidth:int;
		public var LevelHeight:int;
		private var TileWidth:int;
		private var TileHeight:int;
		
		//---*El level tiene una referencia del World asi puede decirle que entidad agregar y cuando:
		public var myWorld:GameWorld=null;
		
		
		public function Level(file:Class) 
		{								
			//---*Obtiene el XML desde los Assets:
			this.level_xml = FP.getXML(file);
			this.project_xml = FP.getXML(Assets.PROJECT_XML);
			
			//trace("level_xml.@width = "+level_xml.@width+"       level_xml.@height = "+level_xml.@height);
			//---*Obtiene el ancho del nivel desde el archivo:
			this.LevelWidth = level_xml.@width;
			//---*Obtiene el alto del nivel desde el archivo:
			this.LevelHeight = level_xml.@height;	
			
			//---*Le doy los valores del ancho y alto de los tiles que usamos, pero es posible que exista una forma de pedirlo al archivo:
			this.TileWidth  = (int)(project_xml.Tilesets.Tileset.TileSize.Width);//16;
			this.TileHeight = (int)(project_xml.Tilesets.Tileset.TileSize.Height);//16;
			//---*MARCAMOS A ESTA ENTIDAD COMO SOLIDA:
			this.type = "Solido";		
		}
		
        //---*EL NIVEL SE CARGA EN EL BEGIN POR LAS DUDAS:
		public function begin():void {			
			this.SolidGrid = new Grid(this.LevelWidth, this.LevelHeight, this.TileWidth, this.TileHeight);
			//---*Carga la grid desde el archivo xml (el del nivel):
      this.SolidGrid.loadFromString(level_xml.Grid, "");
			//---*Le decimos que la mask de colision es SolidGrid;
			this.mask = this.SolidGrid;						
			//---*Creamos el TileMap (aca le doy por pasado el tileset0_img) pero debe haber una forma de que le pase el tileset que va a usar:
			TileLayer0 = new Tilemap(Assets.TILESET_IMG, this.LevelWidth, this.LevelHeight, this.TileWidth, this.TileHeight);			
			//TileLayer0.loadFromString(xml.TileLayer0); //---*Esta funcion es la que trae FP, la es === que "loadFromSting" solo que tiene algunos cambios, me fue mejor usar la de abajo:
			//---*Leemos el archivo buscando la capa TileLayer0 para rellenar nuestro tileLayer0
			loadFromString(this.TileLayer0, level_xml.TileLayer0);			
			//---*Aniadimos la capa como elemento grafico de esta entidad (aca si tenemos mas capas se aniaden en ese constructor)
			graphic = new Graphiclist(this.TileLayer0);
			
			
			//---ENTIDADES:			
			var list:XMLList; //---*Lista de todos los elementos del archivo xml:
      var element:XML;  //---*Objeto "Elemento" que vamos a ir modificando segun lo que buscamos
			//---*Pedimos la lista de Tanque del xml y la pasamos a nuestra variable list:
			list = level_xml.Entities.tanque;
			//---*Busca esos elementos en la lista:
      for each (element in list) {
        //---*Si lo encuentra le dice al World que lo aniada (le pasamos el x e y del elemento):
        this.myWorld.AddEntity("tanque", element.@x, element.@y);
      }

			list = level_xml.Entities.helicoptero;
			//---*Busca esos elementos en la lista:
      for each (element in list) {
        //---*Si lo encuentra le dice al World que lo aniada (le pasamos el x e y del elemento):
        this.myWorld.AddEntity("helicoptero", element.@x, element.@y);
      }
			
			list = level_xml.Entities.wall;
      for each (element in list) {
        //---*Si lo encuentra le dice al World que lo aniada (le pasamos el x e y del elemento):
        this.myWorld.AddEntity("wall", element.@x, element.@y);
				//trace("creando wall en :   x = "+element.@x+"   y = "+element.@y);
      }
			
			
			list = level_xml.Entities.peak;
			for each(element in list) {
				this.myWorld.AddEntity("peak", element.@x, element.@y);
			}
			//---*Aniadimos todo a World:
			super.added();				
		}
		
	    /**
        * Loads the Tilemap data from a string.
        * @param  str      The string data, which is a set of tile values separated by the columnSep and rowSep strings.
        * @param  columnSep  The string that separates each tile value on a row, default is ",".
        * @param  rowSep    The string that separates each row of tiles, default is "\n".
        */
        public function loadFromString(TileMap:Tilemap,str:String, columnSep:String = ",", rowSep:String = "\n"):void
        {
          var row: Array = str.split(rowSep);
          var rows: int = row.length;
      
          for (var y:int = 0; y < rows; y++){
               if (row[y] == '') { continue; }
        
               var col: Array = row[y].split(columnSep);
               var cols: int = col.length;
        
          for (var x:int = 0; x < cols; x++)
          {
              if (col[x] == '') { continue; }
              if(col[x] != "-1")
                 TileMap.setTile(x, y, uint(col[x]));
          }
          }
        
		}
		
		
		
	}

}